<?php
// Пароль учителя (его имя может быть произвольным, но без пробелов)
$admPwd = "12345";

// Генерированиe пароля (6 цифр) из имени вида Борис_Ф
function pwdGen($im) {
   $salt = "abcdef";
   return substr(base_convert(sha1($salt.$im),16,10),3,6);
}

// Русская дата (только число и месяц) из даты вида 2025-06-12
function rusDt($dt) {
   return preg_replace("/\d+-(\d+)-(\d+)/", "$2.$1", $dt);
}

// Авторизация клиента
@$nm  = $_REQUEST["nm"]  or die("none"); // Борис_Ф
@$pwd = $_REQUEST["pwd"] or die("none");
$nm   = htmlspecialchars(substr($nm,  0, 80), ENT_QUOTES, "UTF-8");
$pwd  = htmlspecialchars(substr($pwd, 0, 50), ENT_QUOTES, "UTF-8");
if ($pwd == $admPwd) $nm = "teacher";
else if (pwdGen($nm) !== $pwd) {sleep(3); die("none");}

// Создаем или открываем базу
if(!file_exists("reg.db")) {
   $db  = new SQLite3("reg.db");

   // Дата урока, предмет, тема, домашнее задание, к-во часов, вес отметок   
   $sql = "CREATE TABLE topics("
        . "dt TEXT, sb TEXT, tp TEXT, ht TEXT, vlm TEXT, wg TEXT)";
   $db->query($sql);

   // Дата урока, предмет, ученик, отметка (даты отметок ПА - в config.json)   
   $sql = "CREATE TABLE marks(dt TEXT, sb TEXT, pup TEXT, mrk TEXT)";
   $db->query($sql);
} else $db = new SQLite3("reg.db");

// Выполняем действие в зависимости от запрошенной функции
@$func = $_REQUEST["f"] or die("none");
$func  = substr($func, 0, 20);
switch ($func) {
   // *************************************************************
   // Авторизация юзера
   case "auth": echo "success"; break;

   // ****************************************************************
   // Запись темы урока в базу (либо удаление колонки при пустой теме)
   case "svtopic":
   if ($nm != "teacher") die("none");

   $flds = explode('¤', file_get_contents('php://input'));
   $dt  = $flds[0]; $sb  = $flds[1]; $tp  = $flds[2];
   $ht  = $flds[3]; $val = $flds[4]; $wt  = $flds[5];

   // Если тема пустая, удаляем и тему, и колонку отметок
   if (!$tp) {
      $db->exec("BEGIN"); 
      $q = "DELETE from topics WHERE (dt='$dt' AND sb='$sb')";
      $result = $db->exec($q); if (!$result) die("none");
      $q = "DELETE from marks WHERE (dt='$dt' AND sb='$sb')";
      $result = $db->exec($q); if (!$result) die("none");
      $db->exec("COMMIT");
   }
   // Пишем/редактируем тему в базе
   else {
      // Есть ли уже в базе тема с этой датой и предметом?
      $q = "SELECT COUNT(*) FROM topics WHERE (dt='$dt' AND sb='$sb')";
      $result = $db->query($q);
      $res = $result->fetchArray(SQLITE3_ASSOC);
      $n = $res["COUNT(*)"];

      $db->exec("BEGIN");

      // Если нет - пишем новую тему
      if (!$n) {         
         $q = "INSERT INTO topics (dt, sb, tp, ht, vlm, wg) "
            . "VALUES ('$dt', '$sb', '$tp', '$ht', '$val', '$wt')";
         $result = $db->exec($q); $db->exec("COMMIT");
         if (!$result) die("none");
      }
      // Если есть - обновляем существующую тему
      else {
         $q = "UPDATE topics SET "
            . "tp='$tp', ht='$ht', vlm='$val', wg='$wt' "
            . "WHERE (dt='$dt' AND sb='$sb')";
         $result = $db->exec($q); $db->exec("COMMIT");
         if (!$result) die("none");
      }
   }
   echo "success";
   break;

   // *************************************************************
   // Выдача всех тем уроков по данному предмету
   case "showtpcs":
   if ($nm != "teacher") die("none");
   @$sb = $_REQUEST["sb"] or die("none");
   $q = "SELECT * FROM topics WHERE (sb='$sb') ORDER BY dt";
   $result = $db->query($q);
   $out = '';   
   while($res = $result->fetchArray(SQLITE3_ASSOC)) {
      $htask = $res["ht"] ? " <span class='home'>[".$res["ht"]."]</span>":'';
      $out .= "<p id='t".$res["dt"]."'><span onclick=uptpc('"
            . $res["dt"]."')>".rusDt($res["dt"])."</span> "
            . "<span class='topic'>".$res["tp"]."</span>"
            . $htask." (<span class='vol'>".$res["vlm"]."</span> ч)"
            . "<span class='weight'>".$res["wg"]."</span></p>";
   }
   echo "success$out";
   break;

   // *************************************************************
   // Выдача таблицы со всеми датами и отметками по одному предмету
   // {"2025-03-12": {"w":"1.5", "Иванов_В": "н5", ...}, ...}
   case "allmrk":
   if ($nm != "teacher") die("none");
   @$sb = $_REQUEST["sb"] or die("none");

   // Все отметки по данному предмету в массив $mrkArr
   $q = "SELECT dt, pup, mrk FROM marks WHERE (sb='$sb')";
   $result = $db->query($q);
   $mrkArr = array();
   while($res = $result->fetchArray(SQLITE3_ASSOC)) {
      $d = $res["dt"];
      $p = $res["pup"];
      if (!@$mrkArr[$d]) $mrkArr[$d] = array();
      $mrkArr[$d][$p] = $res["mrk"];
   }
   // Все даты с весами отметок и самими отметками из массива $mrkArr
   $datesAll = [];
   $q = "SELECT dt, wg FROM topics WHERE (sb='$sb')";
   $result = $db->query($q);
   $out = '{';   
   while($res = $result->fetchArray(SQLITE3_ASSOC)) {
      $d = $res["dt"];
      $datesAll[] = $d; // собираем все даты в массив $datesAll
      $out .= '"'.$d.'":{"w":"'.$res["wg"].'"';
      if (@$mrkArr[$d])
         foreach ($mrkArr[$d] as $p => $m) $out .= ',"'.$p.'":"'.$m.'"';    
      $out .= '},';
   }
   // Теперь еще добавляем отметки ПА, их дат в таблице topics не было
   foreach ($mrkArr as $d => $pmArr) {
      if (!in_array($d, $datesAll)) {
         $out .= '"'.$d.'":{"w":""';
         foreach ($pmArr as $p => $m) $out .= ',"'.$p.'":"'.$m.'"';
         $out .= '},';
      }
   }
   echo "success$out}";
   break;

   // *************************************************************
   // Запись отметки в базу
   case "putmark":
   if ($nm != "teacher") die("none");
   @$sbm = $_REQUEST["sb"]  or die("none");
   @$pup = $_REQUEST["pup"] or die("none");
   @$dtm = $_REQUEST["dt"]  or die("none");
   @$mrk = $_REQUEST["mrk"] or $mrk = '';
   
   // Есть ли уже в базе отметка с этой датой, предметом и учеником?
   $q = "SELECT COUNT(*) FROM marks "
      . "WHERE (dt='$dtm' AND sb='$sbm' AND pup='$pup')";
   $result = $db->query($q);
   $res = $result->fetchArray(SQLITE3_ASSOC);
   $n = $res["COUNT(*)"];

   $db->exec("BEGIN");

   // Если нет - пишем новую отметку
   if (!$n) {         
      $q = "INSERT INTO marks (dt, sb, pup, mrk) "
         . "VALUES ('$dtm', '$sbm', '$pup', '$mrk')";
      $result = $db->exec($q); $db->exec("COMMIT");
      if (!$result) die("none");
   }
   // Если есть - обновляем существующую отметку
   else {
      $q = "UPDATE marks SET mrk='$mrk'"
         . "WHERE (dt='$dtm' AND sb='$sbm' AND pup='$pup')";
      $result = $db->exec($q); $db->exec("COMMIT");
      if (!$result) die("none");
   }   
   echo "success";
   break;

   // ************************************************************************
   // Выдача всех тем и отметок одного ученика по всем предметам
   // success{объект_отметок}¤{объект_тем}
   case "onepup":
   if ($nm == "teacher") die("none");
   $out = 'success{';

   // Сначала объект со всеми отметками данного ученика
   // {"g": {"2025-03-12": "н5", ...}, "a": ...}
   $q = "SELECT dt, sb, mrk FROM marks WHERE (pup='$nm')";
   $result = $db->query($q);
   $pupMrkArr = array();
   while($res = $result->fetchArray(SQLITE3_ASSOC)) {
      $d = $res["dt"];
      $s = $res["sb"];
      $m = $res["mrk"];
      if ($m) {
         if (!@$pupMrkArr[$s]) $pupMrkArr[$s] = array();         
         $pupMrkArr[$s][$d] = $m;
      }
   }
   foreach ($pupMrkArr as $sbj0 => $val0) {
      if (!$sbj0) continue;
      $out .= '"'.$sbj0.'":{';
      foreach ($val0 as $dt0 => $mrk0) $out .= '"'.$dt0.'":"'.$mrk0.'",';
      $out .= '},';
   }
   $out .= "}¤{";

   // Теперь объект со всеми темами
   // {"g": {"2025-03-12": ["1.5", "Африка", "Читать"], ...}, "a": ...}
   $q = "SELECT * FROM topics";
   $result = $db->query($q);
   $topicsArr = array();
   while($res = $result->fetchArray(SQLITE3_ASSOC)) {
      $dtta = $res["dt"];
      $sbbj = $res["sb"];
      $tppc = $res["tp"];
      $hmtk = $res["ht"];
      $wgit = $res["wg"];
      if (!@$topicsArr[$sbbj]) $topicsArr[$sbbj] = array();      
      $topicsArr[$sbbj][$dtta] = [$wgit, $tppc, $hmtk];
   }
   foreach ($topicsArr as $sbj9 => $val9) {
      if (!$sbj9) continue;
      $out .= '"'.$sbj9.'":{';
      foreach ($val9 as $dt9 => $a9)
         $out .= '"'.$dt9.'":["'.$a9[0].'","'.$a9[1].'","'.$a9[2].'"],';
      $out .= '},';
   }
   $out .= "}";
   echo $out;
   break;

   default: echo "none";
}
?>
